package com.zjdiepu.www.common.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
/**
 * 文件工具类
 * @author xiongxiaotun
 * @date 2017年3月23日 下午2:39:46
 * @since v1.0.0
 * @update
 */
public class FileUtil {
	
	/**
	 * 有效图片后缀
	 */
	private final static List<String> IMAGE_SUFFIX_ARRAY = Arrays.asList("jpg", "gif", "png", "bmp", "jpeg");
	
   /**
    * @author xiongxiaotun <br/>
    * @Title: getFileSuffix  <br/>
    * @Description: 获取文件后缀 <br/>
    * @param fileName 文件名
    * @return
    * @version V1.0  <br/>
    */
    public static String getFileSuffix(String fileName) {
    	if (StringUtils.isNotBlank((fileName))) {
    		return fileName.substring(fileName.lastIndexOf(".") + 1);
    	}
    	return null;
    }
    
    /**
     * @author xiongxiaotun <br/>
     * @Title: getFileContent  <br/>
     * @Description: 获取文件内容  <br/>
     * @param file 文件
     * @return byte[] byte数组的文件内容
     * @version V1.0  <br/>
     */
    public static byte[] getFileContent(File file) {
    	if(file == null) {
    		return null;
    	}
    	if(!file.exists()) {
    		return null;
    	}
    	FileInputStream fis = null;
        try {
        	fis = new FileInputStream(file);
        	FileChannel channel = fis.getChannel();
        	ByteBuffer bb = ByteBuffer.allocate((int) channel.size());
			channel.read(bb);
			byte[] datas = bb.array();
			return datas;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			release(fis, null);
		}
        return null;
    }
    
    /**
     * @author xiongxiaotun <br/>
     * @Title getFileContent  <br/>
     * @Description 获取文件分片内容 <br/>
     * @param file 文件
     * @param partitions 总分片数
     * @param partition 分片序号
     * @param start 分片开始字节
     * @return
     * @version V1.0  <br/>
     */
    public static byte[] getFileContent(File file, int partitionSize, int partition, int start) {
    	if(file == null) {
    		return null;
    	}
    	if(!file.exists()) {
    		return null;
    	}
    	FileInputStream fis = null;
    	try {
    		fis = new FileInputStream(file);
    		FileChannel channel = fis.getChannel();
    		ByteBuffer bb = ByteBuffer.allocate((int) channel.size());
    		channel.read(bb);
    		byte[] datas = bb.array();
    		return datas;
    	} catch (IOException e) {
    		e.printStackTrace();
    	} finally {
    		release(fis, null);
    	}
    	return null;
    }
    
    /**
     * @author xiongxiaotun <br/>
     * @Title: release  <br/>
     * @Description: 回收资源 <br/>
     * @param input 内存输入流
     * @param output 内存输出流
     * @version V1.0  <br/>
     */
	public static void release(InputStream input, OutputStream output) {
		try {
			if (input != null) {
				input.close();
			}
			if (output != null) {
				output.flush();
				output.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * @author xiongxiaotun <br/>
	 * @Title: getFileContent  <br/>
	 * @Description: 将List<Byte>转换成byte数组  <br/>
	 * @param list 数据字节
	 * @return byte[] byte数组的文件内容
	 * @version V1.0  <br/>
	 */
    public static byte[] getFileContent(List<Byte> list) {
        if (list == null || list.size() == 0) {
            return null;
        }
        byte[] result = new byte[list.size()];
        for (int i = 0; i < list.size(); i++) {
            result[i] = list.get(i);
        }
        return result;
    }
    
    /**
     * @author xiongxiaotun <br/>
     * @Title: isvalidImage  <br/>
     * @Description: 判断是否为图片格式的文件  <br/>
     * @param fileName 文件名
     * @return true-是图片，false-不是图片
     * @version V1.0  <br/>
     */
    public static boolean isValid(String fileName) {
        String suffix = getFileSuffix(fileName);
        if (StringUtils.isBlank(suffix)) {
        	return false;
        }
        if(IMAGE_SUFFIX_ARRAY.contains(suffix.toLowerCase())) {
        	return true;
        }
        return false;
    }
}
